package main

import "fmt"

//[intermediate] 关于接口，下面说法正确的是（）
//A. 只要两个接口拥有相同的方法列表（次序不同不要紧），那么它们就是等价的，可以相互赋值
//B. 如果接口A的方法列表是接口B的方法列表的子集，那么接口B可以赋值给接口A
//C. 接口查询是否成功，要在运行期才能够确定
//D. 接口赋值是否可行，要在运行期才能够确定
//参考答案：ABC

/*
【多选题】关于接口，下面说法正确的是（）

A. 只要两个接口拥有相同的方法列表（次序不同不要紧），那么它们就是等价的，可以相互赋值

B. 如果接口A的方法列表是接口B的方法列表的子集，那么接口B可以赋值给接口A

C. 接口查询是否成功，要在运行期才能够确定

D. 接口赋值是否可行，要在运行期才能够确定

正确答案是：A、B、C

考察的知识点：

Go语言接口的知识点把握，提问最多的是问：什么事接口查询？ 如下解释：

什么是类型查询

就是不知道一个变量的具体类型，是不是很奇怪，对于严格类型检查的语言中，怎么会不知道变量类型了？golang中的interface{}就是其中一种，一个函数，接收任何类型的变量作为参数，对于不同类型的参数，采用不同的处理方法，这样就需要类型查询。

类型查询方法

只能对interface{}类型的变量使用类型查询

varwhichType interface{}

//第一种方式：

obj,ok:=whichType.(bufio.Reader)

//如果whichType是一个bufio.Reader类型的变量，则ok为true，否则为false，当为true时，obj就是一个bufio.Reader类型的变量。

//第二种方式：

switchval := whichType.( type){

casestring:

caseint:

default:

fmt.Println(val)

}

// case条件匹配成功后，val就是匹配的那个对象的一个实例。

提示：通过reflect包提供的方法，可以更加全面的去判断类型。
*/

type A interface {
	DoWork()
}

type B interface {
	DoWork()
	Happy()
}

type Human struct {
	Name string
}

func (h Human) DoWork() {
	fmt.Println(h.Name + " 工作...")
}

type Person struct {
	Name string
}

func (p Person) DoWork() {
	fmt.Println(p.Name + "是富二代，无需工作。")
}

func (p Person) Happy() {
	fmt.Println(p.Name + "在玩")
}

func main() {

	var a A
	var b B

	// 可以， A 是B的子集，所以B有全部的A
	a = b
	fmt.Println(a)
}
